#include <stdio.h>
#include<string.h>

#define MAX_ORDERS 100
#define MAX_SUPPLIERS 10
#define MAX_MATERIALS 20
#define MAX_ITEMS 100
typedef enum {
    daiwancheng,
    queren,
    wancheng,
    quxiao
} dingdanzhuangtai;
typedef struct {
    int id;
    char name[50];
} yuancailiao;
typedef struct {
    int id;
    char name[50];
} gongyingshang;
typedef struct {
    int id;
    gongyingshang supplier;
    yuancailiao material;
    dingdanzhuangtai status;
} Order;
//yuancailiao materials[MAX_MATERIALS] = {
//        {1, "Tomatoes"},
//        {2, "Potatoes"},
//        {3, "Onions"}
//};
gongyingshang suppliers[MAX_SUPPLIERS] = {
        {1, "Supplier A"},
        {2, "Supplier B"},
        {3, "Supplier C"}
};
Order orders[MAX_ORDERS];
int order_count = 0;

void createOrder(gongyingshang supplier, yuancailiao material);

void queryOrder(int order_id);

void auditOrder(int order_id);

void cancelOrder(int order_id);

struct user {
    int ID;
    int mima;
};
struct user user_list[100];  // 全局数组，用于存储用户信息
//定义餐厅管理员的信息结构体
int sum = 0;
struct supply {
    int sup_ID;
    char phone[100];
    char address[200];
    int chanpinsum;
} supply;// 全局变量，用于跟踪已注册的用户数量
int sup_sum = 0;
struct supply supply_list[100];
//定义供应商的信息结构体
struct yuancailiao1 {
    char name[50];
    char leibie[50];
    double price;
    int baozhiqi;// 保质期，单位：天
    int kucun;
} yuancailiao1;
struct yuancailiao1 yuancailiao1_list[100];
int yuancailiao1_sum = 0;
//定义原材料结构体
struct kucun {
    struct yuancailiao1 kucun;
    int some;
} kucun;
struct kucun kucun_list[100];
int kucun_sum = 0;

void add() {
    int i;
    while (sum < 100) {  // 确保不会超出数组容量
        printf("注册中～请输入您的用户信息（输入-1作为账号以结束）：\n");
        printf("账号：（只支持数字形式）");
        scanf("%d", &i);
        if (i == -1) {
            break;  // 用户决定停止输入
        }
        user_list[sum].ID = i;
        printf("密码：（请输入一串数字）");
        scanf("%d", &user_list[sum].mima);
        printf("请牢记您是第%d位用户\n", sum + 1);
        sum++;  // 增加已注册用户数量
    }
    if (sum == 100) {
        printf("用户列表已满，无法添加更多用户。\n");
    }
}

//添加餐厅管理员以及供应商的”账号和密码“
void add_supply() {
    int i;
    while (sup_sum < 100) {  // 确保不会超出数组容量
        printf("请输入您的供应商信息（输入-1作为账号以结束）：\n");
        printf("账号：");
        scanf("%d", &i);
        if (i == -1) {
            break;  // 用户决定停止输入
        }
        supply_list[sup_sum].sup_ID = i;
        printf("联系方式：");
        scanf("%s", &supply_list[sup_sum].phone);
        printf("地址: (示例：shenyangshi)");
        scanf("%s", &supply_list[sup_sum].address);
        printf("产品种类数量: ");
        scanf("%d", &supply_list[sup_sum].chanpinsum);
        sup_sum++;  // 增加已注册用户数量
    }
    if (sup_sum == 100) {
        printf("供应商列表已满，无法添加更多。\n");
    } else {
        printf("供应商注册成功，等待审核。\n");
    }
}

//添加供应商的基本信息（待审核）
int shenhe(int x) {
    int i;
    if (strcmp(supply_list[x].address, "shenyangshi") == 0 && supply_list[x].chanpinsum >= 50) {
        return 1;
    } else {
        return 0;
    }
}

//审核已输入的供应商信息是否可以通过（条件为：1、地址为：沈阳市；2、产品种类数量：>=50）
void denglu() {
    int shuru_ID;
    int shuru_mima;
    printf("登录中～请输入账号：");
    scanf("%d", &shuru_ID);
    printf("请输入密码：");
    scanf("%d", &shuru_mima);
    // 检查用户名和密码
    for (int i = 0; i < sum; i++) {
        if (user_list[i].ID == shuru_ID && user_list[i].mima == shuru_mima) {
            printf("登录成功！\n");
            return;
        } else {
            printf("用户名或密码错误。\n");
        }
    }
}

//登录信息并审核
void select(int num) {
    printf("ID:%d,mima:%d", user_list[num - 1].ID, user_list[num - 1].mima);
}

void sup_select(int num) {
    printf("ID:%d,phone:%s,address:%s,chanpinsum:%d", supply_list[num - 1].sup_ID, supply_list[num - 1].phone,
           supply_list[num - 1].address, supply_list[num - 1].chanpinsum);
}

void add_yuancailiao1() {
    int i;
    while (yuancailiao1_sum < 100) {
        printf("请输入原材料名称: ");
        scanf("%s", &yuancailiao1_list[yuancailiao1_sum].name);
        printf("请输入原材料类别: ");
        scanf("%s", &yuancailiao1_list[yuancailiao1_sum].leibie);
        printf("请输入原材料价格: ");
        scanf("%lf", &yuancailiao1_list[yuancailiao1_sum].price);
        printf("请输入原材料保质期(天): ");
        scanf("%d", &yuancailiao1_list[yuancailiao1_sum].baozhiqi);
        // 将新原材料添加到数组中
        yuancailiao1_sum++;
        printf("是否停止输入？（是：输入0；不是：输入1）\n");
        scanf("%d", &i);
        if (i == 0) {
            break;
        }
    }
    printf("原材料添加成功！\n");
}

void select_yuancailiao1(int num) {
    printf("名称:%s,类别:%s,价格:%lf,保质期:%d", yuancailiao1_list[num - 1].name, yuancailiao1_list[num - 1].name,
           yuancailiao1_list[num - 1].leibie, yuancailiao1_list[num - 1].price, yuancailiao1_list[num - 1].baozhiqi
    );
}

int find_yuancailiao1(char *name) {
    int i;
    for (i = 0; i < yuancailiao1_sum; i++) {
        if (strcmp(yuancailiao1_list[i].name, name) == 0) {
            return i;
        }
    }
    return -1;
}

void add_kucun() {
    char name[50];
    int num, i;
    printf("请输入要添加库存的原材料名称：\n");
    scanf("%s", name);
    i = find_yuancailiao1(name);
    if (i == -1) {
        printf("原材料不存在，请先添加原材料。\n");
        return;
    } else {
        printf("请输入要添加的库存数量：\n");
        scanf("%d", &num);
        yuancailiao1_list[i].kucun += num;
        printf("库存添加成功！当前库存数量：%d\n", yuancailiao1_list[i].kucun);
    }
}

//添加库存
void select_kucun(int num) {
    printf("名称:%s,数量:%d,", yuancailiao1_list[num - 1].name, kucun_list[num - 1].some);
}

//查询库存
void createOrder(gongyingshang supplier, yuancailiao material) {
    if (order_count < MAX_ORDERS) {
        orders[order_count].id = order_count;
        orders[order_count].supplier = supplier;
        orders[order_count].material = material;
        orders[order_count].status = daiwancheng;
        printf("∂©µ•¥¥Ω®À≥–Ú: %d\n", order_count);
        order_count++;
    } else {
        printf("订单已满。\n");
    }
}

void queryOrder(int order_id) {
    if (order_id >= 0 && order_id < order_count) {
        Order order = orders[order_id];
        printf("Order ID: %d\n", order.id);
        printf("Supplier: %s\n", order.supplier.name);
        printf("Material: %s\n", order.material.name);
        printf("Status: %d\n", order.status);
    } else {
        printf("订单无效。\n");
    }
}

void auditOrder(int order_id) {
    if (order_id >= 0 && order_id < order_count) {
        Order *order = &orders[order_id];
        if (order->status == daiwancheng) {
            order->status = queren;
            printf("%d号即将完成.\n", order_id);
        } else {
            printf("%d 号无法确认, 错误状态: %d\n", order_id, order->status);
        }
    } else {
        printf("订单无效。\n");
    }
}

void cancelOrder(int order_id) {
    if (order_id >= 0 && order_id < order_count) {
        Order *order = &orders[order_id];
        if (order->status == daiwancheng) {
            order->status = quxiao;
            printf("%d 号将会被取消。\n", order_id);
        } else {
            printf(" %d 不会被取消, 错误状态: %d\n", order_id, order->status);
        }
    } else {
        printf("订单无效。\n");
    }
}

// 定义原材料结构体
struct Material {
    char name[50];
    float purchasePrice;
    float salePrice;
    int quantity;
};
// 定义销售记录结构体
struct SaleRecord {
    char date[11]; // 日期格式：YYYY-MM-DD
    char materialName[50];
    int quantitySold;
};
// 定义采购记录结构体
struct PurchaseRecord {
    char date[11]; // 日期格式：YYYY-MM-DD
    char materialName[50];
    int quantityPurchased;
};
// 添加原材料
int materialCount;
// 全局变量
struct Material materials[MAX_ITEMS];
struct SaleRecord sales[MAX_ITEMS];
struct PurchaseRecord purchases[MAX_ITEMS];
int materialCount = 0, saleCount = 0, purchaseCount = 0;

void addMaterial() {
    if (materialCount >= MAX_ITEMS) {
        printf("原材料已达到最大数量，无法添加。\n");
        return;
    }
    struct Material mat;
    printf("请输入原材料名称: ");
    scanf("%s", mat.name);
    printf("请输入采购价格: ");
    scanf("%f", &mat.purchasePrice);
    printf("请输入销售价格: ");
    scanf("%f", &mat.salePrice);
    printf("请输入当前库存数量: ");
    scanf("%d", &mat.quantity);
    materials[materialCount++] = mat;
}

// 函数声明
void addMaterial();

void addSale();

void addPurchase();

void generateSalesReport();

void generatePurchasesReport();

void generateInventoryReport();

void addSale();
void addPurchase();
void generateSalesReport();
void generatePurchasesReport();
void generateInventoryReport();
void addMaterials(void)
{
    if (materialCount >= MAX_ITEMS)
    {
        printf("原材料已达到最大数量，无法添加。\n");
        return;
    }
    struct Material mat;
    printf("请输入原材料名称: ");
    scanf("%s", mat.name);
    printf("请输入采购价格: ");
    scanf("%f", &mat.purchasePrice);
    printf("请输入销售价格: ");
    scanf("%f", &mat.salePrice);
    printf("请输入当前库存数量: ");
    scanf("%d", &mat.quantity);
    
    materials[materialCount++] = mat;
    printf("原材料添加成功！\n");
}
// 添加销售记录
void addSale(void)
{
    if (saleCount >= MAX_ITEMS)
    {
        printf("销售记录已达到最大数量，无法添加。\n");
        return;
    }
    struct SaleRecord sale; printf("请输入销售日期 (YYYY-MM-DD): ");
    scanf("%s", sale.date);
    printf("请输入原材料名称: ");
    scanf("%s", sale.materialName);
    printf("请输入销售数量: ");
    scanf("%d", &sale.quantitySold);
    sales[saleCount++] = sale;
    printf("销售记录添加成功！\n");
}
// 添加采购记录
void addPurchase(void)
{
    if (purchaseCount >= MAX_ITEMS)
    {
        printf("采购记录已达到最大数量，无法添加。\n");
        return;
    }
    struct PurchaseRecord purchase;
    printf("请输入采购日期 (YYYY-MM-DD): ");
    scanf("%s", purchase.date);
    printf("请输入原材料名称: ");
    scanf("%s", purchase.materialName);
    printf("请输入采购数量: ");
    scanf("%d", &purchase.quantityPurchased);
    purchases[purchaseCount++] = purchase;
    printf("采购记录添加成功！\n");
}
// 生成销售报表
void generateSalesReport(void)
{
    printf("\n--- 销售报表 ---\n");
    printf("日期\t\t原材料\t\t销售数量\n");
    for (int i = 0; i < saleCount; i++)
    {
        printf("%s\t%s\t%d\n", sales[i].date, sales[i].materialName, sales[i].quantitySold);
    }
}
// 生成采购报表
void generatePurchasesReport(void)
{
    printf("\n--- 采购报表 ---\n");
    printf("日期\t\t原材料\t\t采购数量\n");
    for (int i = 0; i < purchaseCount; i++)
    {
        printf("%s\t%s\t%d\n", purchases[i].date, purchases[i].materialName, purchases[i].quantityPurchased);
    }
}
// 生成库存报表
void generateInventoryReport(void)
{ printf("\n--- 库存报表 ---\n"); printf("原材料\t\t采购价格\t销售价格\t库存数量\n");
    for (int i = 0; i < materialCount; i++)
    {
        printf("%s\t%.2f\t\t%.2f\t\t%d\n", materials[i].name, materials[i].purchasePrice, materials[i].salePrice, materials[i].quantity);
    }
}

//模拟系统通知函数
void systemNotification(char *message) {
    printf("System Notification: %s\n", message);
}

// 模拟邮件提醒函数（这里只是打印，实际需使用邮件库发送邮件）
void sendEmailNotification(char *recipient, char *subject, char *message) {
    printf("Sending email to %s:\nSubject: %s\nMessage: %s\n", recipient, subject, message);
}

// 模拟短信提醒函数（这里只是打印，实际需使用短信网关发送短信）
void sendSMSNotification(char *phoneNumber, char *message) {
    printf("Sending SMS to %s:\nMessage: %s\n", phoneNumber, message);
}

int main(int argc, const char *argv[]) {
    int a, i, b, num, choice;
    printf("请输入用户身份：（餐厅管理员输入“1”，供应商输入“0”）\n");//判断用户身份
    scanf("%d", &a);
    if (a == 1) {
        add();
        denglu();
        printf("请问您是否需要查询您的用户信息？（是：输入1；否：输入0）\n");
        scanf("%d", &b);
        if (b == 1) {
            printf("请输入您的用户序列号：\n");
            scanf("%d", &num);
            select(num);
        }
    } else if (a == 0) {
        add_supply();
    } else {
        printf("输入无效，请重新输入，输入0/1。\n");
    }
    for (i = 0; i < sup_sum; i++) {
        if (shenhe(i)) {
            printf("恭喜您，审核通过。\n");
            add();
            denglu();
            printf("请问您是否需要查询您的用户信息？（是：输入1；否：输入0）\n");
            scanf("%d", &b);
            if (b == 1) {
                printf("请输入您的用户序列号：\n");
                scanf("%d", &num);
                sup_select(num);
            } else {
                printf("很抱歉，您的审核结果未通过。\n");
            }
        }
        //用于审核供应商信息并提供友好提示及结果反馈
    }
    printf("\n原材料管理系统\n");
    printf("1. 添加原材料\n");
    printf("2. 查询原材料\n");
    printf("3. 退出\n");
    printf("请输入选择(1-3): ");
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            add_yuancailiao1();
            break;
        case 2:
            select_yuancailiao1(yuancailiao1_sum);
            break;
        case 3:
            break;
        default:
            printf("无效选择，请重新输入！\n");
    }
    printf("\n库存管理系统\n");
    printf("1. 添加库存\n");
    printf("2. 查询库存0\n");
    printf("3. 退出\n");
    printf("请输入选择(1-3): ");
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            add_kucun();
            break;
        case 2:
            select_kucun(kucun_sum);
            break;
        case 3:
            break;
        default:
            printf("无效选择，请重新输入！\n");
    }
    printf("\n--- 原材料管理系统 ---\n");
    printf("1. 添加原材料\n");
    printf("2. 添加销售记录\n");
    printf("3. 添加采购记录\n");
    printf("4. 生成销售报表\n");
    printf("5. 生成采购报表\n");
    printf("6. 生成库存报表\n");
    printf("0. 退出\n");
    printf("请输入你的选择: ");
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            addMaterials();
            break;
        case 2:
            addSale();
            break;
        case 3:
            addPurchase();
            break;
        case 4:
            generateSalesReport();
            break;
        case 5:
            generatePurchasesReport();
            break;
        case 6:
            generateInventoryReport();
            break;
        case 0:
            return 0;
        default:
            printf("无效的选择，请重试。\n");
    }
    char systemMessage1[] = "Your order has been approved.";
    systemNotification(systemMessage1);
    char systemMessage2[] = "Inventory is low for some products. Please restock.";
    systemNotification(systemMessage2);
    // 邮件提醒示例
    char recipientEmail[] = "2394346437@qq.com";
    char emailSubject[] = "Important Order Update";
    char emailMessage[] = "Your recent order status has changed. Check it out.";
    sendEmailNotification(recipientEmail, emailSubject, emailMessage);
    // 短信提醒示例
    char phoneNumber[] = "1008611";
    char smsMessage[] = "There is an urgent matter regarding your account.";
    sendSMSNotification(phoneNumber, smsMessage);
}
